(() => {

  // 类：可以理解为模版，通过模版可以实例化对象
  // 面向对象的编程思想

  // ts中类的定义
  class Person {
    // 定义属性
    name: string
    age: number
    gender: string
    // 定义构造函数，为了将来实例化对象的时候。可以 直接对属性的值进行初始化
    constructor(name: string, age: number, gender: string) {
      // 更新对象中的属性
      this.name = name
      this.age = age
      this.gender = gender
    }

    // 定义实例化的方法
    sayHi(role: string = '人') {
      console.log(`大家好：我是${this.name},我今年${this.age},性别${this.gender}---我是一个${role}`)
    }
  }


  const person = new Person('dd', 18, 'nv')
  person.sayHi('人')



  // 类的继承
  // 继承；类与类之间的关系
  // 子类：派生类
  // 基类：超类（父类）
  // 一旦发生了继承的关系，就出现了父子类的关系

  class Student extends Person {
    constructor(name: string, age: number, gender: string) {
      // 调用的是父类中的构造函数，使用的是super
      super(name, age, gender)
    }

    // 可以重写父类中的方法
    sayHi(role: string = "学生") {
      console.log(`大家好：我是${this.name},我今年${this.age},性别${this.gender}---我是一个${role}`)
      // 可以调用父类中的方法了
      // super.sayHi()
    }
  }

  const student = new Student('小甜甜', 18, '男')
  student.sayHi()

  // 类和类之间如果要有继承的关系，需要使用extends关键字
  // 子类中调用父类中的构造函数，使用的是super方法
  // 子类可以重写父类中的方法


  // 类的多态
  // 多态：父类型的引用指向了子类型的对象，不同类型的对象针对相同的方法，产生了不同的行为

  class Teacher extends Person {

    constructor(name: string, age: number, gender: string) {
      super(name, age, gender)
    }

    sayHi(role: string = "老师") {
      console.log(`大家好：我是${this.name},我今年${this.age},性别${this.gender}---我是一个${role}`)
    }
  }

  const teacher = new Teacher('小明', 12, '男')
  teacher.sayHi()


  // 父类类型创建子类对象
  const studen1: Person = new Student('章三', 12, '男')
  studen1.sayHi()

  const studen2: Person = new Student('李四', 12, '女')
  studen2.sayHi()








})()